package joc;

import java.util.ArrayList;

/**
 *
 * @author Ady
 */

enum Resursa {
    LEMN,PIATRA,METAL;
     public float conversie(Resursa res) {
            switch (this) {
                case LEMN:
                    switch (res) {
                        case LEMN:
                            return 1;
                        case PIATRA:
                            return (float) 2 / 3;
                        case METAL:
                            return (float) 1 / 3;
                    }
                case PIATRA:
                    switch (res) {
                        case LEMN:
                            return (float) 3 / 2;
                        case PIATRA:
                            return 1;
                        case METAL:
                            return 2;
                    }
                case METAL:
                    switch (res) {
                        case LEMN:
                            return 3;
                        case PIATRA:
                            return 2;
                        case METAL:
                            return 1;
                    }
                default:
                    return -1;
            }
        }
}

class Resurse {
    private int LEMN;
    private int PIATRA;
    private int METAL;
    public Resurse(int lemn, int piatra, int metal) {
        this.LEMN=lemn;
        this.PIATRA=piatra;
        this.METAL=metal;
    }
    public int getLemn() {
        return this.LEMN;
    }
    public int getPiatra() {
        return this.PIATRA;
    }
    public int getMetal() {
        return this.METAL;
    }
    public void adaugaLemn(int lemn) {
        this.LEMN = this.LEMN + lemn;
    }
    public void adaugaPiatra(int piatra) {
        this.PIATRA = this.PIATRA + piatra;
    }
    public void adaugaMetal(int metal) {
        this.METAL = this.METAL + metal;
    }
    public boolean existaResurse(Resurse res) {
        return this.LEMN >= res.getLemn() && this.PIATRA >= res.getPiatra() && this.METAL >= res.getMetal();
    }
    public void consumaResurse(Resurse res) {
        this.LEMN = this.LEMN - res.getLemn();
        this.PIATRA = this.PIATRA - res.getPiatra();
        this.METAL = this.METAL -res.getMetal();
    }
}

class Cladire {
    private Resurse res_necesare;
    private String nume_cladire;
    public Cladire() {
        // ceva random
        res_necesare = new Resurse(5,2,0);
        nume_cladire = "cladire";
    }
    public Resurse getResurse() {
        return this.res_necesare;
    }
    public String getNumeCladire() {
        return this.nume_cladire;
    }
}

public class Jucator implements Runnable{

    private Resurse resurse;
    private ArrayList<Cladire> cladiri;
    private Cladire target;
    
    public Jucator() {
        resurse = new Resurse(10,5,2);
        cladiri = new ArrayList<>(0);
        target = new Cladire();
    }
    @Override
    public void run() {
        
        while(target!=null) {
            if(construieste()) {
                puneOferte();
            } else {
                anuleazaOferte(); 
                if(construieste()) {
                    puneOferte();
                } else {
                    iaResurseProducator();
                }
            }
        }
        
    }
    
    private boolean construieste() {
        System.out.println(".. Incearca construire cladire..");
        if(resurse.existaResurse(target.getResurse())) {
            this.cladiri.add(target);
            System.out.println("  S-a construit cladirea!!");
            resurse.consumaResurse(target.getResurse());
            System.out.println("  Resurse ramase: "+resurse.getLemn()+" lemn, "+resurse.getPiatra()+" piatra, "+resurse.getMetal()+" metal");
            target = new Cladire();
            return true;
        }
        System.out.println("  Resurse insuficiente!!");
        return false;
    }
    
    private void puneOferte() {
        int dif_Lemn, dif_Piatra, dif_Metal;
        dif_Lemn = resurse.getLemn() - target.getResurse().getLemn();
        dif_Piatra = resurse.getPiatra() - target.getResurse().getPiatra();
        dif_Metal = resurse.getMetal() - target.getResurse().getMetal();
        
        while ( (dif_Lemn >0 || dif_Piatra>0 || dif_Metal>0) && (dif_Lemn <0 || dif_Piatra<0 || dif_Metal<0) ) {
            System.out.println("- schimba "+dif_Lemn+" lemn, "+dif_Piatra+" piatra, "+dif_Metal+" metal");
            
            // aici calculeaza tibi cum se fac ofertele... 
            // te folosesti de converisa de la Resursa
            break;
        }
    }
    
    private synchronized void anuleazaOferte() {
        int dif_Lemn, dif_Piatra, dif_Metal, cantitate, max;
        Resursa oferita, primaCeruta, aDouaCeruta;
        
        dif_Lemn = resurse.getLemn() - target.getResurse().getLemn();
        max=cantitate=dif_Lemn;primaCeruta=aDouaCeruta=oferita=Resursa.LEMN;
        dif_Piatra = resurse.getPiatra() - target.getResurse().getPiatra();
        if(dif_Piatra<cantitate){cantitate=dif_Piatra;oferita=Resursa.PIATRA;}
        if(dif_Piatra>max){max=dif_Piatra;primaCeruta=Resursa.PIATRA;}
        dif_Metal = resurse.getMetal() - target.getResurse().getMetal();
        if(dif_Metal<cantitate){cantitate=dif_Metal;oferita=Resursa.METAL;}
        if(dif_Metal>max){max=dif_Metal;primaCeruta=Resursa.METAL;}
        
        System.out.println(" @Anuleaza oferta. stare resurse: "+dif_Lemn+" lemn, "+dif_Piatra+" piatra, "+dif_Metal+" metal");        
        if( oferita == Resursa.LEMN && primaCeruta == Resursa.METAL || oferita == Resursa.METAL && primaCeruta == Resursa.LEMN) 
            aDouaCeruta=Resursa.PIATRA;
        if( oferita == Resursa.LEMN && primaCeruta == Resursa.PIATRA || oferita == Resursa.PIATRA && primaCeruta == Resursa.LEMN) 
            aDouaCeruta=Resursa.METAL;        
        if( oferita == Resursa.PIATRA && primaCeruta == Resursa.METAL || oferita == Resursa.METAL && primaCeruta == Resursa.PIATRA) 
            aDouaCeruta=Resursa.LEMN;        
        System.out.println(" ---> anuleazaOferta( this, "+oferita+", "+(-1)*cantitate+", "+primaCeruta+", "+aDouaCeruta+" );");
        //Comert.anuleazaOferta(this,oferita,-cantitate,primaCeruta,aDouaCeruta);
    }
    
    public void vinResurseDinComert(int cantitate,Resursa res) {
        synchronized (this.resurse) {
            switch (res) {
                case LEMN: this.resurse.adaugaLemn(cantitate);
                    break;
                case PIATRA: this.resurse.adaugaPiatra(cantitate);
                    break;
                case METAL: this.resurse.adaugaMetal(cantitate);
                    break;
            }
            System.out.println("...  + "+cantitate+" "+res);
        }
    }   
    
    private void iaResurseProducator() {
        
    }
}
